From 9ad19a00bdc36cf94aefd15692bfc9d65fa8e595 Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Mon, 12 Mar 2007 09:44:34 +0000 Subject: [PATCH] [HVM] Speed up bulk p2m operations such as domain creation by not flushing the shadows more often than is needed. Signed-off-by: Tim Deegan --- xen/arch/x86/mm/shadow/common.c | 6 +++++- xen/arch/x86/mm/shadow/multi.c | 2 ++ xen/include/asm-x86/domain.h | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 4907736299..15ebf1d541 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -2813,7 +2813,11 @@ shadow_write_p2m_entry(struct vcpu *v, unsigned long gfn, l1_pgentry_t *p, This is pretty heavy handed, but this is a rare operation (it might happen a dozen times during boot and then never again), so it doesn't matter too much. */ - shadow_blow_tables(d); + if ( d->arch.paging.shadow.has_fast_mmio_entries ) + { + shadow_blow_tables(d); + d->arch.paging.shadow.has_fast_mmio_entries = 0; + } #endif shadow_unlock(d); diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c index 581ab45196..108c2e692d 100644 --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -660,6 +660,8 @@ _sh_propagate(struct vcpu *v, { /* Guest l1e maps MMIO space */ *sp = sh_l1e_mmio(guest_l1e_get_gfn(*gp), gflags); + if ( !d->arch.paging.shadow.has_fast_mmio_entries ) + d->arch.paging.shadow.has_fast_mmio_entries = 1; goto done; } diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 94791f7a80..6c88e5abb0 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -79,6 +79,9 @@ struct shadow_domain { struct shadow_page_info **hash_table; int hash_walking; /* Some function is walking the hash table */ + /* Fast MMIO path heuristic */ + int has_fast_mmio_entries; + /* Shadow log-dirty bitmap */ unsigned long *dirty_bitmap; unsigned int dirty_bitmap_size; /* in pages, bit per page */ -- 2.30.2